float4x4 World;
float4x4 View;
float4x4 Projection;

// TODO: ここでエフェクトのパラメーターを追加します。
float3 LightDirection;	// ライトの方向ベクトル
float3 CameraPosition;	// カメラの位置ベクトル

// アンビエントカラー
float4 AmbientColor = float4(0.15, 0.15, 0.15, 0);


// テクスチャ
texture		g_texture;				// テクスチャ
bool		g_tex;					// テクスチャの有り無し false:なし true:あり


//--------------------------------------------------------
// サンプラー1
//--------------------------------------------------------
sampler TextureSampler1 = 
sampler_state
{
	Texture		= <g_texture>;
//	MinFilter	= LINEAR;			// リニアフィルタ(縮小時)
//	MagFilter	= LINEAR;			// リニアフィルタ(拡大時)
//	MinFilter	= POINT;			// フィルタをかけない
//	MagFilter	= POINT;			// フィルタをかけない
	MinFilter	= ANISOTROPIC;		// 異方性フィルタ(縮小時)
	MagFilter	= ANISOTROPIC;		// 異方性フィルタ(拡大時)
};


struct VertexShaderInput
{
    float4 Position : POSITION0;

    // TODO: ここにテクスチャー座標および頂点カラーなどの
    // 入力チャンネルを追加します。
	float3 Normal : NORMAL;
	float2 Texture : TEXCOORD0;

};

struct VertexShaderOutput
{
    float4 Position : POSITION0;

    // TODO: ここにカラーおよびテクスチャー座標などの頂点シェーダーの
    // 出力要素を追加します。これらの値は該当する三角形上で自動的に補間されて、
    // ピクセル シェーダーへの入力として提供されます。
	float3 Normal : NORMAL;
	float2 Texture : TEXCOORD0;
};

VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
    VertexShaderOutput output;

    float4 worldPosition = mul(input.Position, World);
    float4 viewPosition = mul(worldPosition, View);
    output.Position = mul(viewPosition, Projection);

    // TODO: ここで頂点シェーダー コードを追加します。

	// テクスチャ座標をそのまま出力する
	output.Texture = input.Texture;

	// 法線をワールド空間上のベクトルに変換して、単位ベクトル化
	output.Normal = normalize(mul(input.Normal,(float3x3)World));

    return output;
}


float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
    // TODO: ここでピクセル シェーダー コードを追加します。
	float3 N;
	float3 L;


	// 法線ベクトルを単位ベクトル化
	N = normalize(input.Normal);

	// 平行光の差し込む方向　単位ベクトル化
	L = normalize(-LightDirection);

	// モデルの色
	float4 diffuseColor = tex2D(TextureSampler1, input.Texture);
	
	// ライト方向に基づいた輝度
	float diffuseIntensity = saturate(dot(L,N));


	// 最終的なカラー
	float4 diffuse = diffuseIntensity * diffuseColor + AmbientColor;

	// 出力カラーを求める
    return diffuse;
}

technique PhongTechnique
{
    pass Pass1
    {
        // TODO: ここでレンダーステートを設定します。

        VertexShader = compile vs_3_0 VertexShaderFunction();
        PixelShader = compile ps_3_0 PixelShaderFunction();
    }
}
